package com.atguigu.juc.day03.jmm;

import java.util.concurrent.TimeUnit;

/**
 * 如何理解可见性？
 * 对于 A 线程来说，并不知道 B 线程修改了 number 的值。
 * 如果 A 线程没有到主内存重新读取 number 数据，那么永远都不知道 number 的修改。
 * 给 number 成员变量附加 volatile 关键词修改即可解决可见性问题
 */
public class Demo03CanSee {

    private int number = 100;

    public int getNumber() {
        return number;
    }

    public void setNumber(int number) {
        this.number = number;
    }

    public static void main(String[] args) {

        Demo03CanSee demo = new Demo03CanSee();

        new Thread(()->{

            // ※只有代码这么写的时候才能看到可见性问题的现象
            while (demo.getNumber() == 100) {}
            System.out.println(Thread.currentThread().getName() + " 发现了新值，number = " + demo.getNumber());

        }, "thread-a").start();

        new Thread(()->{

            try {
                TimeUnit.SECONDS.sleep(3);

                demo.setNumber(200);

                System.out.println(Thread.currentThread().getName() + " 线程修改了 number 的值。");
                System.out.println("demo.getNumber() = " + demo.getNumber());

            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }

        }, "thread-b").start();

    }
}
